package org.tissou.client.Services;


import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;

import com.google.gwt.user.client.rpc.IsSerializable;
import com.google.gwt.user.client.ui.TreeItem;


/**
 * Created by IntelliJ IDEA.
 * User: Claire
 * Date: 16-Mar-2009
 * Time: 18:46:43
 * To change this template use File | Settings | File Templates.
 */
public class ProprietaireInfos implements IsSerializable {
  private String nom;
  Map<String, Compte> TousLesComptes = new HashMap<String, Compte>();

  public ProprietaireInfos(){
    this.nom = "";
  }

  public ProprietaireInfos(String nom){
    this.nom = nom;
  }

  // La methode suivante (public void addCompte(Compte compte))
  // ne sont a utiliser que dans le cas de la creation d'un Proprietaire (Sur le serveur).

   public void addCompte(Compte compte) {
    TousLesComptes.put(compte.getNomCompte(),  compte);
  }




  public List<Compte> RenvoyerComptesVirtuels(){
    List<Compte> ResultatVirtuel = new ArrayList<Compte>();
    for (Compte compte : this.TousLesComptes.values()){
      if (compte.CompteVirtuel()){
        ResultatVirtuel.add(compte);
      }
    }
    return ResultatVirtuel;
  }

  public Compte RenvoyerCompteVirtuel (MonnaieInfos monnaie){
    for (Compte compte : this.RenvoyerComptesVirtuels()){
      if (compte.getMonnaie().equals(monnaie)) {
        return compte;
      }
    }
    return null;
  }

  public Compte ObtenirCompte (String nom){
    return TousLesComptes.get(nom);
  }

  public Compte ObtenirCompte (int nocompte){
   for (Compte c : TousLesComptes.values()){
     if (c.getNoCompte() == nocompte){
       return c;
     }
   }
    return null;
  }

  public boolean equals(Object proprietaire){
    if (proprietaire instanceof ProprietaireInfos) {
      ProprietaireInfos p = (ProprietaireInfos) proprietaire;
      return this.nom.equals(p.nom);
    } else {
      return false;
    }
  }

  public String getNom() {
    return nom;
  }

  public Map<String, Compte> getTousLesComptes() {
    return TousLesComptes;
  }

  public Map<MonnaieInfos, List<Compte>> comptesClassesParMonnaie() {
	    Map<MonnaieInfos, List<Compte>> listeDesComptesParMonnaie = new HashMap<MonnaieInfos, List<Compte>>();
	    for (Compte c : TousLesComptes.values()){     
	        if (listeDesComptesParMonnaie.containsKey(c.getMonnaie())) {
	          listeDesComptesParMonnaie.get(c.getMonnaie()).add(c);
	        } else {
	          List<Compte> liste = new ArrayList<Compte>();
	          liste.add(c);
	          listeDesComptesParMonnaie.put(c.getMonnaie(), liste);
	        }	      
	    }
	    return listeDesComptesParMonnaie;
	  }


  public Map<MonnaieInfos, List<Compte>> comptesReelsClassesParMonnaie() {
    Map<MonnaieInfos, List<Compte>> listeDesComptesParMonnaie = new HashMap<MonnaieInfos, List<Compte>>();
    for (Compte c : TousLesComptes.values()){
      if(!c.CompteVirtuel()){
        if (listeDesComptesParMonnaie.containsKey(c.getMonnaie())) {
          listeDesComptesParMonnaie.get(c.getMonnaie()).add(c);
        } else {
          List<Compte> liste = new ArrayList<Compte>();
          liste.add(c);
          listeDesComptesParMonnaie.put(c.getMonnaie(), liste);
        }
      }
    }
    return listeDesComptesParMonnaie;
  }

  public TreeItem donneLArbreDesComptes() {
    TreeItem arbre = new TreeItem("Comptes de "+this.getNom());

    for (MonnaieInfos monnaie : this.comptesReelsClassesParMonnaie().keySet()) {
      TreeItem branche = new TreeItem(monnaie.getNomMonnaie());
      branche.setUserObject(monnaie);

      arbre.addItem(branche);
      for (Compte compte : this.comptesReelsClassesParMonnaie().get(monnaie)){
        TreeItem feuille = new TreeItem(compte.getNomCompte());
        feuille.setUserObject(compte);
        branche.addItem(feuille);
      }
      branche.setState(true);
    }
    arbre.setState(true);
    return arbre;
  }
  
  public String listeComptesPourUneMonnaieDonneeSousFormeDeString(MonnaieInfos monnaie){
	List<Compte> comptes = this.comptesClassesParMonnaie().get(monnaie);
	StringBuilder s = new StringBuilder();
	int count=0;
        
    for (Compte c : comptes){
    	if(count==0){
    		s.append("'").append(c.getNoCompte()).append("'");
    		count++;
    	}
    	else {
    		s.append(", '").append(c.getNoCompte()).append("'");
    	}
    }
    
    return s.toString();
  }

}
